home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
(A)Z
/
(A)Z7.ADF
/
C
/
xref
/
xrf3.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-10-31
|
3KB
|
104 lines
/*
* ***************
* * X R F 3 . C *
* ***************
*
* Sorted cross reference listing routines. 'prtree' performs an
* inorder traversal of the id tree, printing the references to'
* each id while visiting that node.
*
* Version V1.3 9-May-80
* Version V1.4 10-Jul-80 MM Bummed code, added 80 col. support
*/
#include <stdio.h>
#include "xrf.h"
/*
* Inorder tree traversal.
*/
prtree(link)
struct idt *link;
{
if (debug) {printf("xrf: beginning prtree\n");}
if (link != NULL)
{
prtree(link->left); /* Visit the left */
prtrefs(link); /* Print refs for this one */
prtree(link->right); /* Visit the right */
}
}
/*
* List out a line of references.
* Start new page if it gets full.
*/
lstrefs()
{
if(++linpg > MAXLIN) /* New page if necessary */
newpage();
fputs(scanbf, lst); /* Write out the string */
fputc('\n',lst); /* Terminate with newline */
}
/*
* Print id and references.
* Share scan buffer for printout.
* Use newpag.
*
* The ref line number field width is hard-wired into the format statement.
* Trouble is, #define's don't (and shouldn't!) substitute into strings,
* like formats.
*
* Current values are 5 char field (RSIZE) and rperline ref's per line.
*/
prtrefs(link)
struct idt *link;
{
register struct ref *r; /* Ref chain pointer */
register char *p; /* Fast scan buffer pointer */
register int j; /* Counts refs printed on a line */
char *cpystr(); /* cpystr returns char pointer */
if (debug) {printf("xrf: beginning prtrefs\n");}
r = link->first; /* r --> head of ref chain */
p = scanbf; /* p --> start of scan buffer */
j = 0; /*Init refs-per-line */
p = cpystr(p, link->keyp); /* Start with the id string */
while(p < &scanbf[NCPS]) { /* Pad with blanks */
*p++ = ' ';
}
*p++ = '\t'; /* Followed by a tab */
do
{ /* List Reference line numbers */
if(j >= rperline) /* If this line is full */
{
*p = '\0'; /* Terminate with null */
lstrefs(); /* Write it out */
p = scanbf; /* Reset buffer pointer */
j = 0; /* Reset refs-on-line count */
*p++ = '\t'; /* Start cont. line w/ 2 tabs */
*p++ = '\t';
}
j++;
sprintf(p,"%5d", r->lno); /* Insert reference into buffer */
p += RSIZE; /* Update buffer pointer */
r = r->next; /* On down the chain */
}
while(r != NULL); /* Until the end */
*p = '\0'; /* Terminate with null */
if (debug) {printf("xrf: all references done; p %d\n",p);}
if (debug) {printf("xrf: scanbf: \"%s\"\n",scanbf);}
lstrefs(); /* Write the line out */
}